package com.bst.base.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import com.bst.base.domain.BaseTempItem;
import com.bst.base.service.IBaseTempItemService;
import com.bst.base.vo.BaseTempVO;
import com.bst.common.utils.self.LoginAPIUtils;
import com.bst.system.domain.HosSfxmGroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.bst.base.mapper.BaseTempMapper;
import com.bst.base.domain.BaseTemp;
import com.bst.base.service.IBaseTempService;
import com.bst.common.core.text.Convert;
import org.springframework.transaction.annotation.Transactional;

/**
 * 项目模板Service业务层处理
 * 
 * @author ruoyi
 * @date 2023-11-28
 */
@Service
public class BaseTempServiceImpl implements IBaseTempService 
{
    @Autowired
    private BaseTempMapper baseTempMapper;
    @Autowired
    private IBaseTempItemService baseTempItemService;

    /**
     * 查询项目模板
     * 
     * @param idLisTemp 项目模板主键
     * @return 项目模板
     */
    @Override
    public BaseTemp selectBaseTempByIdLisTemp(Long idLisTemp)
    {
        return baseTempMapper.selectBaseTempByIdLisTemp(idLisTemp);
    }

    /**
     * 查询项目模板列表
     * 
     * @param baseTemp 项目模板
     * @return 项目模板
     */
    @Override
    public List<BaseTemp> selectBaseTempList(BaseTemp baseTemp)
    {
        return baseTempMapper.selectBaseTempList(baseTemp);
    }

    /**
     * 新增项目模板
     * 
     * @param baseTemp 项目模板
     * @return 结果
     */
    @Override
    public int insertBaseTemp(BaseTemp baseTemp)
    {
        return baseTempMapper.insertBaseTemp(baseTemp);
    }

    @Override
    @Transactional
    public int insertBaseTemp(BaseTempVO tempVO) {
        String na = tempVO.getNa();
        BaseTemp  temp= new BaseTemp();
        temp.setIdUser(LoginAPIUtils.getLoginUserId());
        temp.setNa(na);
        temp.setSdTempCls(tempVO.getSdTempCls());
        List<BaseTemp> temps = this.selectBaseTempList(temp);
        boolean fgnew=true;
        List<BaseTempItem> newItems = new ArrayList<>();
        if(temps.size()==0) {
            temp.setNaUser(LoginAPIUtils.getLoginUsename());
            temp.setSdTempCls(tempVO.getSdTempCls());
            temp.setFgDef(tempVO.getFgDef());
            this.insertBaseTemp(temp);
        } else {
            temp = temps.get(0);
            fgnew=false;
        }
        List<BaseTempItem> addItems = tempVO.getItemList();
        for (BaseTempItem item : addItems) {
            item.setIdLisTemp(temp.getIdLisTemp());
        }
        if(!fgnew) {
            BaseTempItem tempItem = new BaseTempItem();
            tempItem.setIdLisTemp(temp.getIdLisTemp());
            List<BaseTempItem> oldItems = baseTempItemService.selectBaseTempItemList(tempItem);
            List<String> cdItems = oldItems.stream().map(BaseTempItem::getCd).collect(Collectors.toList());
            if(cdItems.size()>0) {
                for (BaseTempItem item : addItems) {
                    if(cdItems.contains(item.getCd())) {
                       continue;
                    }
                    item.setIdLisTemp(temp.getIdLisTemp());
                    newItems.add(item);
                }
            } else {
                newItems = addItems;
            }
        } else {
            newItems = addItems;
        }
        if(newItems.size()>0) {
            baseTempItemService.insertBatchBaseTempItem(newItems);
        }
        return 1;
    }

    /**
     * 修改项目模板
     * 
     * @param baseTemp 项目模板
     * @return 结果
     */
    @Override
    public int updateBaseTemp(BaseTemp baseTemp)
    {
        return baseTempMapper.updateBaseTemp(baseTemp);
    }

    /**
     * 批量删除项目模板
     * 
     * @param idLisTemps 需要删除的项目模板主键
     * @return 结果
     */
    @Override
    public int deleteBaseTempByIdLisTemps(String idLisTemps)
    {
        return baseTempMapper.deleteBaseTempByIdLisTemps(Convert.toStrArray(idLisTemps));
    }

    /**
     * 删除项目模板信息
     * 
     * @param idLisTemp 项目模板主键
     * @return 结果
     */
    @Override
    @Transactional
    public int deleteBaseTempByIdLisTemp(Long idLisTemp)
    {
        baseTempItemService.deleteBaseTempItemByIdLisTemp(idLisTemp);
        return baseTempMapper.deleteBaseTempByIdLisTemp(idLisTemp);
    }
}
